﻿using dotnet_ef_admin.Src.Models;
using dotnet_ef_admin.Src.Utilities;

namespace dotnet_ef_admin.Src.Services;

/// <summary>
///     定义了角色服务的接口，提供了对角色相关操作的抽象。
/// </summary>
public interface IRoleService {
    /// <summary>
    ///     异步获取所有角色的列表。
    /// </summary>
    /// <returns>包含所有角色的异步任务。</returns>
    // 获取所有角色列表
    Task<GetAllRolesResult> FindAllAsync(GetAllRolesRequest request);

    /// <summary>
    ///     根据角色ID异步获取特定角色。
    /// </summary>
    /// <param name="id">要获取的角色的ID。</param>
    /// <returns>包含指定角色ID的异步任务，如果角色不存在，则为null。</returns>
    // 读取角色（根据ID）
    Task<Role?> FindByIdAsync(int id);

    /// <summary>
    ///     异步创建一个新的角色。
    /// </summary>
    /// <param name="role">待创建的角色实例。</param>
    /// <returns>包含新创建角色的异步任务。</returns>
    // 创建角色
    Task<Role> CreateAsync(Role role);

    /// <summary>
    ///     异步更新现有角色的信息。
    /// </summary>
    /// <param name="role">包含更新信息的角色实例。</param>
    /// <returns>包含更新后角色的异步任务。</returns>
    // 更新角色信息
    Task<Role> UpdateAsync(Role role);

    /// <summary>
    ///     异步删除指定ID的角色。
    /// </summary>
    /// <param name="id">要删除的角色的ID。</param>
    /// <returns>不返回值的异步任务。</returns>
    // 删除角色
    Task DeleteAsync(int id);

    /// <summary>
    ///     异步批量删除指定ID的角色。
    /// </summary>
    /// <param name="ids">要删除的角色的ID数组。</param>
    /// <returns>包含删除后受影响的行数的异步任务。</returns>
    Task<int> DeleteManyAsync(int[] ids);

    /// <summary>
    ///     异步根据角色ID获取角色的详细信息。
    /// </summary>
    /// <param name="id">要获取的角色ID。</param>
    /// <returns>包含具有指定ID的角色的异步任务，如果未找到该角色，则为null。</returns>
    Task<Role?> FindFormAsync(int id);

    /// <summary>
    ///     异步根据角色ID获取该角色关联的菜单ID集合。
    /// </summary>
    /// <param name="id">要获取关联菜单ID的角色ID。</param>
    /// <returns>包含角色关联菜单ID的异步任务。</returns>
    Task<List<int>> FindMenusAsync(int id);

    /// <summary>
    ///     异步更新指定ID的角色的关联菜单。
    /// </summary>
    /// <param name="id">要更新的角色ID。</param>
    /// <param name="menuIds">要关联的菜单ID集合。</param>
    /// <returns>不返回值的异步任务。</returns>
    Task UpdateMenusAsync(int id, List<int> menuIds);

    /// <summary>
    ///     异步获取角色选项列表。
    /// </summary>
    /// <returns>
    /// 一个异步操作，返回包含<see cref="TransformedItem"/>对象的列表，
    /// 该列表表示了所有角色的选项。
    /// </returns>
    Task<List<TransformedItem>> FindOptionsAsync();

}

public class GetAllRolesRequest {
    public string? Keywords { get; set; }

    public int? PageNum { get; set; } = 1;

    public int? PageSize { get; set; } = 10;
}

public class GetAllRolesResult {
    public int Total { get; set; }

    public IEnumerable<Role> List { get; set; } = [];
}